{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "d827f6d1",
   "metadata": {},
   "outputs": [],
   "source": [
    "from datasets import load_dataset\n",
    "\n",
    "ds = load_dataset(\"christopher/birdclef-2025\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "b0defd51",
   "metadata": {},
   "outputs": [],
   "source": [
    "!mkdir birdclef-2025"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "639388df",
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "import soundfile as sf\n",
    "from tqdm import tqdm\n",
    "from multiprocess import Pool\n",
    "import itertools\n",
    "\n",
    "def chunks(l, n):\n",
    "    for i in range(0, len(l), n):\n",
    "        yield (l[i: i + n], i // n)\n",
    "\n",
    "def multiprocessing(strings, function, cores=6, returned=True):\n",
    "    df_split = chunks(strings, len(strings) // cores)\n",
    "    pool = Pool(cores)\n",
    "    pooled = pool.map(function, df_split)\n",
    "    pool.close()\n",
    "    pool.join()\n",
    "\n",
    "    if returned:\n",
    "        return list(itertools.chain(*pooled))\n",
    "\n",
    "def loop(indices):\n",
    "    indices, _ = indices\n",
    "    ds = load_dataset(\"christopher/birdclef-2025\")\n",
    "    data = []\n",
    "    for i in tqdm(indices):\n",
    "        row = ds['train'][i]\n",
    "        \n",
    "        if row['class_name'] == 'Aves':\n",
    "            continue\n",
    "            \n",
    "        y = row['recording']['array']\n",
    "        sr = row['recording']['sampling_rate']\n",
    "        if (len(y) / sr) >= 30:\n",
    "            continue\n",
    "        \n",
    "        audio_filename = os.path.join('birdclef-2025', row['recording']['path']).replace('.ogg', '.mp3')\n",
    "        sf.write(audio_filename, y, sr)\n",
    "            \n",
    "        row.pop('recording')\n",
    "        row['audio_filename'] = audio_filename\n",
    "        row['len'] = len(y) / sr\n",
    "        data.append(row)\n",
    "        \n",
    "    return data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "bcafc6d2",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|███████████████████████████████████████████████████████████████████████████████████| 1428/1428 [00:29<00:00, 48.42it/s]\n",
      " 95%|███████████████████████████████████████████████████████████████████████████████    | 1361/1428 [00:29<00:01, 53.58it/s]"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "f70b3b3faeed4c938e08ee78ca69abbb",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Resolving data files:   0%|          | 0/20 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|███████████████████████████████████████████████████████████████████████████████████| 1428/1428 [00:30<00:00, 47.16it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████| 1428/1428 [00:32<00:00, 44.42it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████| 1428/1428 [00:30<00:00, 46.19it/s]\n",
      " 75%|██████████████████████████████████████████████████████████████▏                    | 1069/1428 [00:33<00:15, 23.44it/s]"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "f12ffa917dc74b9cb7d04ec44b6a6cda",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Resolving data files:   0%|          | 0/20 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|█████████████████████████████████████████████████████████████████████████████████████████| 4/4 [00:00<00:00, 87.13it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████| 1428/1428 [00:33<00:00, 42.12it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████| 1428/1428 [00:34<00:00, 41.58it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████| 1428/1428 [00:34<00:00, 41.04it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████| 1428/1428 [00:34<00:00, 40.82it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████| 1428/1428 [00:36<00:00, 38.90it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████| 1428/1428 [00:35<00:00, 39.99it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████| 1428/1428 [00:36<00:00, 38.69it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████| 1428/1428 [00:36<00:00, 38.83it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████| 1428/1428 [00:35<00:00, 40.69it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████| 1428/1428 [00:37<00:00, 37.68it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████| 1428/1428 [00:40<00:00, 35.29it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████| 1428/1428 [00:41<00:00, 34.27it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████| 1428/1428 [00:43<00:00, 32.82it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████| 1428/1428 [00:42<00:00, 33.46it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████| 1428/1428 [00:44<00:00, 31.96it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████| 1428/1428 [02:03<00:00, 11.60it/s]\n"
     ]
    }
   ],
   "source": [
    "processed = multiprocessing(list(range(len(ds['train']))), loop, cores = 20)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "d7f3040a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "573"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(processed)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "854a10fb",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'primary_label': '868458',\n",
       " 'secondary_labels': [''],\n",
       " 'type': [''],\n",
       " 'collection': 'CSA',\n",
       " 'rating': 0.0,\n",
       " 'url': 'http://colecciones.humboldt.org.co/rec/sonidos/IAvH-CSA-34220/IAvH-CSA-34220.mp3',\n",
       " 'latitude': -3.8333,\n",
       " 'longitude': -70.3333,\n",
       " 'scientific_name': 'Typophyllum inflatum',\n",
       " 'common_name': 'Typophyllum inflatum',\n",
       " 'author': 'Fernando Montealegre-Z',\n",
       " 'license': 'cc-by-nc-sa 4.0',\n",
       " 'inat_taxon_id': 868458,\n",
       " 'class_name': 'Insecta',\n",
       " 'audio_filename': 'birdclef-2025/CSA34220.mp3',\n",
       " 'len': 2.924875}"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "processed[-1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "211dc042",
   "metadata": {},
   "outputs": [],
   "source": [
    "import json\n",
    "\n",
    "with open('BirdCLEF-2025.json', 'w') as fopen:\n",
    "    json.dump(processed, fopen)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
